/*
 * planificador.h
 *
 *  Created on: 19/09/2011
 *      Author: utn_so
 */
#ifndef PLANIFICADOR_H_
#define PLANIFICADOR_H_
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include "estructurasPPD.h"
#include "archivoConfiguracion.h"
#include "Sockets.h"
#include <errno.h>
#include <pthread.h>
#include <sys/socket.h>
#include <sys/un.h>
#include "funcionesNIPC.h"
#include "funcionesSelect.h"

//#include "estructuras_generales.h"
//#include "/home/utn_so/Desarrollo/Workspace/Operativos/Commons/estructuras_generales.h"



/* El puerto que 	será abierto */
#define BACKLOG 2
#define IDPPD 1
/* El número de conexiones permitidas */
#define PATHARCHIVO "/home/utn_so/Escritorio/big_fat32.disk"
#define NUMINTS  (1000)
#define SECTOR 512
#define TAMANIOARCHIVO (NUMINTS * sizeof(int))
#define SOCK_PATH "echo_socket"

stConfiguracion stConfig;

pthread_mutex_t mutexEnviar;
pthread_mutex_t mutexRecibir;
pthread_mutex_t mutexSincro;

pthread_mutex_t mutexArchConfig;
pthread_mutex_t mutexInfoSector;//TODO declaracion sem1
pthread_mutex_t mutexInfoSector2;//TODO declaracion sem2
pthread_mutex_t mutexPtroFteEscribir;//TODO declaracion sem3
pthread_mutex_t mutexBackup1;




struct listaSelect *punteroFileSystem;
struct listaSelect *punteroFteSelect;
struct listaSelect *punteroFinSelect;

int32_t traceTotal;
int32_t puertoFSSyDisco;
char activarConsola[2];
char cadenaDeMensajeRecibido[100];
int32_t variableAuxiliar;
void *valorRetornoFinHilo;
int bandera;
int32_t hecho;
int32_t socketGlobal;
int32_t direccionSCAN;
int32_t posicionCabezal;
//Variable de archivo de configuracion


//////////////////
int32_t descriptorSocketConsolaPPD,descriptorSocketPlanificador,tamanhoEstructuraSocket;
struct sockaddr_un estructuraSocketPlanificador, estructuraSocketConsolaPPD;
//estructuras cola


int32_t cuantosSectoresEscribi;
int32_t sectoresTotalesDeDisco;
//estructura de los nodos a escribir
struct estructuraEscribir {
int32_t numeroSector;



char infoSector[512];
struct estructuraEscribir *siguiente;
}typedef estructuraEscribir;

//estructura de los nodos a leer
struct estructuraLeer {
	int32_t numeroSector;
	int32_t traceONoTrace;
	int32_t sincro;
	int32_t descriptorAEnviar;
	struct estructuraLeer *siguiente;
}typedef estructuraLeer;


//punteros globales

struct estructuraEscribir *punteroEstructuraEscribir;
struct estructuraEscribir *punteroFrenteEscribir;
struct estructuraEscribir *punteroFinEscribir;

struct estructuraLeer *punteroEstructuraLeer;
struct estructuraLeer *punteroEstructuraSincro;
struct estructuraLeer *punteroFrenteLeer;
struct estructuraLeer *punteroFinLeer;



//funciones
void Archivo_mapear(uint64_t **descriptorArchivo,char**map,struct stat **punteroEstructuraSTAT);
void Archivo_escribir(int32_t numeroSector, char infoAGrabar[512],char**map,struct stat **punteroEstructuraSTAT);
void Archivo_leer(int32_t numeroSector, char *infoAGrabar,char*map);
void Archivo_desmapear(uint64_t** descriptorArchivo, char **map,struct stat **punteroEstructuraSTAT);
int sector_convertiteEnByte (int sector);
void *hilo_Funcion(void *threadid);
int32_t hilo_crear(long hiloId);
int32_t hilo_crear2(long hiloId);
void *hilo_Funcion2(void *threadid);


void sectores_enconlar();

void nodoEscritura_crear(struct estructuraEscribir **punteroEstructura,int32_t sector,char infoSector[512]);
void nodoLectura_crear(struct estructuraLeer **punteroEstructura,int32_t sector,int32_t esTrace,int32_t esSincro);
void colaEscritura_meter(struct estructuraEscribir **punteroFte,struct estructuraEscribir **punteroFin, struct estructuraEscribir **punteroEstructura);
void colaLectura_meter(struct estructuraLeer **punteroFte,struct estructuraLeer **punteroFin, struct estructuraLeer **punteroEstructura);
void colaLectura_liberar(struct estructuraLeer **punteroFrente,struct estructuraLeer **punteroFin);
void mensaje_detectar(void);
void nodoColaLectura_liberar(struct estructuraLeer **punteroFrente,struct estructuraLeer **punteroFin);

void lectura_atender(struct estructuraLeer **punteroLectura,char *map,char lecturaDeBytechar[513]);
void escritura_atender(struct estructuraEscribir **punteroEscritura,char**map,struct stat **punteroEstructuraSTAT);
//int32_t fs_elegirAEnviar(int32_t numeroSector);
void nodoDeColaBackup_eliminar(struct estructuraLeer **punteroBackup,struct estructuraLeer **punteroBackupFin,int32_t sector);
void clienteNuevo_agregar (int servidor, struct listaSelect **punteroFteSelect,struct listaSelect **punteroFinSelect);
int descriptorMaximo_detectar (struct listaSelect **punteroFteSelect,struct listaSelect **punteroFinSelect);
void descriptoresCaidos_detectar (struct listaSelect **punteroFteSelect,struct listaSelect **punteroFinSelect);
void meterNodosParaElTrace(char *sectoresAParsear);
int32_t contarCaracter(char *cadena, char caracterAContar);


#endif /* PLANIFICADOR_H_ */

